package top.jolyoulu.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.yarn.webapp.hamlet2.Hamlet;
import org.checkerframework.checker.units.qual.A;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.net.URI;
import java.util.Arrays;

/**
 * 客户端代码常用套路
 * 1.获取客户端对象
 * 2.执行相关操作命令
 * 3.关闭资源
 */
public class HdfsClient {

    FileSystem fs;

    @Before
    public void init() throws Exception {
        //连接地址
        URI uri = new URI("hdfs://hadoop102:8020");
        //配置文件
        Configuration configuration = new Configuration();
        //用户
        String user = "root";
        //获取客户对象
        fs = FileSystem.get(uri, configuration, user);
    }

    @After
    public void close() throws Exception {
        //关闭资源
        fs.close();
    }

    @Test
    public void testmkdir() throws Exception {
        //执行命令
        fs.mkdirs(new Path("/test/abc"));

    }

    //测试文件上传
    @Test
    public void testPut() throws Exception {
        fs.copyFromLocalFile(
                false,//成功后是否删除源数据
                true,//是否覆盖
                new Path("D:\\tmp\\myfile.txt"), //本地文件路径
                new Path("/")); //上传带dfs上的路径
    }

    //测试文件下载
    @Test
    public void testGet() throws Exception {
        fs.copyToLocalFile(
                true,//成功后是否删除源数据
                new Path("/myfile.txt"),//dfs中的路径
                new Path("D:\\tmp\\1.txt"),//本地文件路径
                false//是否校验
        );
    }

    //测试文件删除
    @Test
    public void testRm() throws Exception {
        fs.delete(
                new Path("/test"),//要删除的dfs路径
                true//是否递归删除
        );
    }

    //测试文件改名或移动
    @Test
    public void testtmv() throws Exception {
        fs.rename(
                new Path("/myfile.txt"),//源文件路径
                new Path("/123.txt")//目标文件路径
        );
    }

    //查看文件信息
    @Test
    public void fileDetail() throws Exception {
        RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(
                new Path("/"), //查看那个目录下文件信息
                true); //是否递归
        while (listFiles.hasNext()) {
            LocatedFileStatus next = listFiles.next();
            System.out.println("文件名称：" + next.getPath().getName());
            System.out.println("文件权限：" + next.getPermission());
            System.out.println("文件大小：" + next.getLen());
            System.out.println("块大小：" + next.getBlockSize());
            System.out.println("块信息：");
            for (BlockLocation blockLocation : next.getBlockLocations()) {
                System.out.println("块存储的目标主机：" + Arrays.asList(blockLocation.getHosts()));
            }
            System.out.println("===========================");
        }
    }

    //判断是文件夹还是文件
    @Test
    public void testFile() throws Exception{
        FileStatus[] listStatus = fs.listStatus(new Path("/"));
        for (FileStatus status : listStatus) {
            if (status.isFile()){
                System.out.println("这是一个文件："+status.getPath().getName());
            }else {
                System.out.println("这是一个文件夹："+status.getPath().getName());
            }
        }
    }
}
